import json
from sqlalchemy.orm import Session, relationship, joinedload
from models import Student_db, Stu_class_db
from schema import Student
from sqlalchemy.sql import func
import schema


# 查出所有学生信息
def get_student_all(db: Session):
    return db.query(Student_db).all()


# 查出单个学生信息
def get_student_by_stuname(db: Session, stuname: str):
    return db.query(Student_db).filter(Student_db.student_name == stuname).first()

def get_student_by_stuid(db: Session, stuid: int):
    return db.query(Student_db).filter(Student_db.student_id == stuid).first()


# 新增学生信息,返回是否成功,只关注与数据库的操作是否成功
def add_student(db: Session, student: Student):
    try:
        # 班级是外键，得先检验班级在stucalss中的class_id是否存在
        class_exist = db.query(Stu_class_db).filter(Stu_class_db.class_id == student.class_id).first()
        if not class_exist:
            return "输入的班级id不存在，请重新输入!"
        # 先转成字典再转成数据库的映射对象，再用添加
        student_db = Student_db(**student.dict(exclude={"student_id"}))
        db.add(student_db)

        # 由于mysql 的事务机制，前面已经关掉了自动刷新和提交，改完表需要自行提交
        db.commit()
        db.refresh(student_db)  # 刷新内存中的student_db这个对象，否则可能还是none
        return "成功创建"
    except Exception as e:
        return f"发生异常{e}"


# 更新一个学生的信息,query的update方法传入一个数据库列名等值的字典
# 更新不需要刷新内存
def update_student(db: Session, student: Student):
    try:
        db.query(Student_db).filter(Student_db.student_id == student.student_id).update(student.dict())

        db.commit()

        return f"成功更新{student.student_name}的信息"
    except Exception as e:
        return f"发生异常{e}"


# 按照学生名称删除一个学生信息
def delete_student(db: Session, stu_name: str):
    try:
        db.query(Student_db).filter(Student_db.student_name == stu_name).delete()

        db.commit()

        return f"成功删除{stu_name}的信息"
    except Exception as e:
        return f"发生异常{e}"


# 查出所有班级信息
def get_class_all(db: Session):
    return db.query(Stu_class_db).all()


# 按照班级id查询班级信息
def get_class_by_id(db: Session, id: str):
    return db.query(Stu_class_db).filter(Stu_class_db.class_id == id).first()

# 添加班级信息
def add_class(db: Session, str_class: schema.stu_class):
    try:
        # 先转成字典再转成数据库的映射对象，再用添加
        class_db = Stu_class_db(**str_class.dict())
        db.add(class_db)

        # 由于mysql 的事务机制，前面已经关掉了自动刷新和提交，改完表需要自行提交
        db.commit()
        db.refresh(class_db)  # 刷新内存中的class_db这个对象，否则可能还是none
        return "成功创建"
    except Exception as e:
        return f"发生异常{e}"
